package co.legu.carpool.api.common;

import co.legu.modules.auth.util.Login;
import co.legu.modules.common.bean.Result;
import co.legu.modules.filepool.api.service.IFilePoolService;
import co.legu.modules.filepool.util.FilePools;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Optional;

/**
 * 文件池控制器
 */
@RestController
@RequestMapping("/api/file")
public class CommonFileController {
    @Autowired
    private IFilePoolService filePoolService;

    /**
     * @api {post} /api/file/upload 公共 - 上传文件
     * @apiDescription 要求提交的`Content-Type`为`multipart/form-data`
     * @apiGroup FilePool
     * @apiVersion 1.0.0
     * @apiParam file 要上传的文件
     * @apiSuccess {String} - 文件的 ID
     */
    @PostMapping(path = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public Result<String> upload(@RequestParam("file") MultipartFile file) throws IOException {
        if (file.isEmpty()) {
            return Result.fail("没有要上传的文件");
        } else {
            return Result.success(this.filePoolService.saveFile(Optional.ofNullable(file.getOriginalFilename()).orElse(""), Login.uid(), file.getInputStream()));
        }
    }

    /**
     * @api {get} /api/file/download/:id 公共 - 下载文件
     * @apiGroup FilePool
     * @apiVersion 1.0.0
     * @apiParam {String} id 要展示的文件的 ID
     * @apiSuccess {Stream} -
     *     不会响应`JSON`，`Content-Type`会设置为`application/octet-stream;charset=UTF-8`<br>
     *     响应体为文件下载，会设置`Content-Disposition`为上传时的文件名<br>
     *     比较适合文件下载类(`<a href="/api/file/download/1111">下载</a>`这种)
     */
    @GetMapping("/download/{id}")
    public Resource download(@PathVariable String id) {
        var filePool = this.filePoolService.getById(id);
        return FilePools.writeToResponse(filePool, true);
    }

    /**
     * @api {get} /api/file/:id 公共 - 展示文件
     * @apiGroup FilePool
     * @apiVersion 1.0.0
     * @apiParam {String} id 要展示的文件的 ID
     * @apiSuccess {Stream} -
     *     不会响应`JSON`，`Content-Type`会按上传文件时的后缀名查`MIME`表进行匹配<br>
     *     响应体为文件下载，不会设置`Content-Disposition`<br>
     *     比较适合图片展示类(`<img src="/api/file/1111">`这种)
     */
    @GetMapping("/{id}")
    public Resource show(@PathVariable String id) {
        var filePool = this.filePoolService.getById(id);
        return FilePools.writeToResponse(filePool, false);
    }
}
